<?php

if(!defined("VL_LEGAL")) die();

/**
 * Класс для работы с базами данных
 * и шаблоны подключения дополнительных классов
 * @author vladimmi <vladimmi@ya.ru>
 */


/**
 * Шаблон пути к файлам операционных слоев.
 * <type> заменяется на обозначение типа БД
 */
define("LAYER_FILE", VL_DIR_CLASSES."vl<type>.class.php");

/**
 * Шаблон имени класса операционного слоя.
 * <type> заменяется на обозначение типа БД
 */
define("LAYER_CLASS", "vl<type>");

/**
 * Класс для работы с различными типами баз данных
 * @author vladimmi
 */
class vlDatabase
{
	/**
	 * Параметры конфигурации
	 * @var mixed
	 */
	private $options;
	
	/**
	 * Объект операционного слоя
	 * @var object
	 */
	private $layer;
	
	/**
	 * Конструктор
	 * @param mixed $options Ассоциативный массив с параметрами базы данных
	 */
	function vlDatabase($options)
	{
		$this->options=$options;
		$file=str_replace("<type>", $options['type'], LAYER_FILE);
		$file_result=include_once($file);
		$class=str_replace("<type>", $options['type'], LAYER_CLASS);
		if($file_result) $this->layer=new $class;
	}
	
	/**
	 * Подключение к серверу
	 * @return bool True, если подключение к серверу успешно установлено и БД существует, иначе false
	 */
	function connect()
	{
		$result=$this->layer->connect($this->options['host'], $this->options['user'], $this->options['pass'], $this->options['name']);
		return $result;
	}
	
	/**
	 * Отключение от сервера
	 * @return bool True, если отключение прошло успешно, иначе false
	 */
	function disconnect()
	{
		$result=$this->layer->disconnect();
		return $result;
	}
	
	/**
	 * Выполнение SQL-запроса
	 * @param string $query Строка запроса
	 * @return resource Ресурс с результатами выполнения запроса
	 */
	function query($query)
	{
		$API=&vlAPI::getInstance();
		$API->debug->group("Запрос БД");
		$qr=str_replace('<prefix>', $this->options['prefix'], $query);
		$API->debug->dump("Строка запроса", $qr);
		$result=$this->layer->query($qr);
		if($err=$this->error())
			$API->debug->error($err, "Ошибка");
		$API->debug->groupEnd();
		return $result;
	}
	
	/**
	 * Разбор результатов запроса в форме ассоциативного массива
	 * @param resource $res Ресурс с результатами запроса
	 * @return mixed Ассоциативный массив с результатами или false, если разбор не удался
	 */
	function fetchAssoc($res)
	{
		return $this->layer->fetchAssoc($res);
	}
	
	/**
	* Разбор результатов запроса в форме массива
	* @param resource $res Ресурс с результатами запроса
	* @return mixed Массив с результатами или false, если разбор не удался
	*/
	function fetchArray($res)
	{
		return $this->layer->fetchArray($res);
	}
	
	/**
	 * Строка ошибки из предыдущей выполненной операции
	 * @return string
	 */
	function error()
	{
		return $this->layer->error();
	}
	
	/**
	 * Количество строк в результатах запроса
	 * @param resource $res Ресурс с результатами запроса
	 * @return int
	 */
	function numRows($res)
	{
		return $this->layer->numRows($res);
	}
	
	/**
	 * ID добавленной при последней операции строки
	 * @return int
	 */
	function insertId()
	{
		return $this->layer->insertId();
	}
	
	/**
	 * Количество рядов, затронутых последней операцией
	 * @return int
	 */
	function affectedRows()
	{
		return $this->layer->affectedRows();
	}
	
	/**
	 * Строка с информацией о сервере БД
	 * @return string
	 */
	function serverInfo()
	{
		return $this->layer->serverInfo();
	}
	
	/**
	 * Результат запрос в виде ассоциативного массива
	 * @param string $query SQL-запрос
	 * @return mixed
	 */
	function getResults($query)
	{
		$result=$this->query($query);
		$r=array();
		if($result)
			while($i=$this->fetchAssoc($result))
				$r[]=$i;
		return $r;
	}
}

?>